home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / lalr.lha / lalr / src / Compress.mi < prev    next >
Text File  |  1992-08-18  |  6KB  |  265 lines

  1. (* compress parse table *)
  2.  
  3. (* $Id: Compress.mi,v 2.2 1992/08/07 15:22:49 grosch rel $ *)
  4.  
  5. (* $Log: Compress.mi,v $
  6.  * Revision 2.2  1992/08/07  15:22:49  grosch
  7.  * allow several scanner and parsers; extend module Errors
  8.  *
  9.  * Revision 2.1  1991/11/21  14:53:14  grosch
  10.  * new version of RCS on SPARC
  11.  *
  12.  * Revision 2.0  91/03/08  18:31:39  grosch
  13.  * turned tables into initialized arrays (in C)
  14.  * moved mapping tokens -> strings from Errors to Parser
  15.  * changed interface for source position
  16.  * 
  17.  * Revision 1.1  90/06/12  16:53:48  grosch
  18.  * renamed main program to lalr, added { } for actions, layout improvements
  19.  * 
  20.  * Revision 1.0     88/10/04  14:35:59  vielsack
  21.  * Initial revision
  22.  * 
  23.  *)
  24.  
  25. IMPLEMENTATION MODULE Compress;
  26.  
  27. FROM Automaton    IMPORT tIndex, tStateIndex;
  28. FROM DynArray    IMPORT MakeArray, ExtendArray;
  29. FROM Gen    IMPORT tTableLine, NoState, LastReadState, FirstTerminal, LastTerminal, FirstSymbol, LastSymbol;
  30. FROM General    IMPORT Max, Min;
  31. FROM SYSTEM    IMPORT TSIZE;
  32. FROM TokenTab    IMPORT Vocabulary;
  33.  
  34.   CONST
  35.     InitTableMax = 1500;
  36.     InitNTableMax = 500;
  37.  
  38. PROCEDURE InitCompressTable;
  39.    VAR
  40.       b        : tIndex;
  41.       State    : tStateIndex;
  42.    BEGIN
  43.       BaseCount       := LastReadState+1;
  44.       MakeArray (Base,BaseCount,ElmtSize);
  45.  
  46.       DefaultCount := LastReadState+1;
  47.       MakeArray (Default,DefaultCount,ElmtSize);
  48.  
  49.       ControlCount := LastSymbol+InitTableMax;
  50.       MakeArray (Control,ControlCount,TSIZE(ControlType));
  51.  
  52.       TableMax := ControlCount - 1;
  53.  
  54.       FOR State := 0 TO LastReadState DO
  55.      Base^ [State] := 0;
  56.      Default^ [State] := NoState;
  57.       END;
  58.  
  59.       FOR b := 0 TO TableMax DO
  60.      Control^ [b].Next  := NoState;
  61.      Control^ [b].Check := NoState;
  62.       END;
  63.  
  64.       TableSize := 0;
  65.     END InitCompressTable;
  66.  
  67. PROCEDURE CompressTableLine (State: tStateIndex; DefaultState: tStateIndex; VAR TableLine: tTableLine);
  68.  
  69. (* Terminale komprimieren *)
  70.  
  71.    VAR
  72.       b        : tIndex;
  73.       Success    : BOOLEAN;
  74.       Symbol    : Vocabulary;
  75.       index    : tIndex;
  76.       OldTableMax : tIndex;
  77.       NextSym    : ARRAY Vocabulary OF Vocabulary;
  78.       StartSym    ,
  79.       StopSym    ,
  80.       PrevSym    : Vocabulary;
  81.    
  82.    BEGIN
  83.  
  84.       Default^ [State] := DefaultState;
  85.  
  86.       (* solution 2 *)
  87.  
  88.       (* turn the row Table [State, ...] into a list *)
  89.  
  90.       Symbol := FirstTerminal;
  91.       Success := FALSE;
  92.       LOOP
  93.      IF Symbol > LastTerminal THEN EXIT; END;
  94.      IF (TableLine [Symbol] # NoState) THEN
  95.         StartSym := Symbol;
  96.         PrevSym  := Symbol;
  97.         Success  := TRUE;
  98.         EXIT;
  99.      END;
  100.      INC (Symbol);
  101.       END;
  102.       INC (Symbol);
  103.  
  104.       LOOP
  105.      IF Symbol > LastTerminal THEN EXIT; END;
  106.      IF (TableLine [Symbol] # NoState) THEN
  107.         NextSym [PrevSym] := Symbol;
  108.         PrevSym := Symbol;
  109.      END;
  110.      INC (Symbol);
  111.       END;
  112.       StopSym := PrevSym;
  113.  
  114.       (* search for a usable base b *)
  115.  
  116.       b := 0;
  117.       IF Success THEN
  118.      LOOP
  119.         Success := TRUE;
  120.         Symbol := StartSym;
  121.         LOOP
  122.            IF (Control^ [b + Symbol].Check    # NoState) THEN
  123.           Success := FALSE;
  124.           EXIT;
  125.            END;
  126.            IF Symbol = StopSym THEN EXIT; END;
  127.            Symbol := NextSym [Symbol];
  128.         END;
  129.  
  130.         IF Success THEN EXIT; END;
  131.         INC (b);
  132.         IF b + LastTerminal > TableMax THEN
  133.            OldTableMax := TableMax;
  134.            ExtendArray (Control,ControlCount,TSIZE(ControlType));
  135.            TableMax := ControlCount - 1;
  136.            FOR index := OldTableMax+1 TO TableMax DO
  137.           Control^ [index].Next     := NoState;
  138.           Control^ [index].Check := NoState;
  139.            END;
  140.         END;
  141.      END;
  142.       ELSE
  143.      Success := TRUE;
  144.       END;
  145.  
  146.       Base^ [State] := b;
  147.       TableSize := Max (TableSize, b);
  148.       FOR Symbol := FirstTerminal TO LastTerminal DO
  149.      IF (TableLine [Symbol] # NoState) THEN
  150.         Control^ [b + Symbol].Check := State;
  151.         Control^ [b + Symbol].Next    := TableLine [Symbol];
  152.         INC (Filling);
  153.      END;
  154.       END;
  155.    END CompressTableLine;
  156.  
  157.  
  158. PROCEDURE InitCompressNTable;
  159.    VAR
  160.       b        : tIndex;
  161.       State    : tStateIndex;
  162.    BEGIN
  163.       NBaseCount := LastReadState+1;
  164.       MakeArray (NBase,NBaseCount,ElmtSize);
  165.       NNextCount := LastSymbol+InitNTableMax;
  166.       MakeArray (NNext,NNextCount,TSIZE(TableElmt));
  167.       NTableMax := NNextCount - 1;
  168.       FOR State := 0 TO LastReadState DO NBase^ [State] := 0; END;
  169.       FOR b := 0 TO NTableMax DO NNext^ [b] := NoState; END;
  170.       NTableSize := 0;
  171.     END InitCompressNTable;
  172.  
  173. PROCEDURE CompressNTableLine (State: tStateIndex; VAR TableLine: tTableLine);
  174.  
  175. (* Nichtterminale komprimieren *)
  176.  
  177.    VAR
  178.       b        : tIndex;
  179.       Success    : BOOLEAN;
  180.       Symbol    : Vocabulary;
  181.       index    : tIndex;
  182.       OldTableMax : tIndex;
  183.       NextSym    : ARRAY Vocabulary OF Vocabulary;
  184.       StartSym    ,
  185.       StopSym    ,
  186.       PrevSym    : Vocabulary;
  187.    
  188.    BEGIN
  189.  
  190.       (* solution 2 *)
  191.  
  192.       (* turn the row Table [State, ...] into a list *)
  193.  
  194.       Symbol := LastTerminal+1; (* FirstNonterminal *)
  195.       Success := FALSE;
  196.       LOOP
  197.      IF Symbol > LastSymbol THEN EXIT; END;
  198.      IF (TableLine [Symbol] # NoState) THEN
  199.         StartSym := Symbol;
  200.         PrevSym  := Symbol;
  201.         Success  := TRUE;
  202.         EXIT;
  203.      END;
  204.      INC (Symbol);
  205.       END;
  206.       INC (Symbol);
  207.  
  208.       LOOP
  209.      IF Symbol > LastSymbol THEN EXIT; END;
  210.      IF (TableLine [Symbol] # NoState) THEN
  211.         NextSym [PrevSym] := Symbol;
  212.         PrevSym := Symbol;
  213.      END;
  214.      INC (Symbol);
  215.       END;
  216.       StopSym := PrevSym;
  217.  
  218.       (* search for a usable base b *)
  219.  
  220.       b := 0;
  221.       IF Success THEN
  222.      LOOP
  223.         Success := TRUE;
  224.         Symbol := StartSym;
  225.         LOOP
  226.            IF (NNext^ [b + Symbol] # NoState) AND
  227.           (NNext^ [b + Symbol] # TableLine [Symbol]) THEN
  228.           Success := FALSE;
  229.           EXIT;
  230.            END;
  231.            IF Symbol = StopSym THEN EXIT; END;
  232.            Symbol := NextSym [Symbol];
  233.         END;
  234.  
  235.         IF Success THEN EXIT; END;
  236.         INC (b);
  237.         IF b + LastSymbol > NTableMax THEN
  238.            OldTableMax := NTableMax;
  239.            ExtendArray (NNext,NNextCount,TSIZE(TableElmt));
  240.            NTableMax := NNextCount - 1;
  241.            FOR index := OldTableMax+1 TO NTableMax DO
  242.           NNext^ [index] := NoState;
  243.            END;
  244.         END;
  245.      END;
  246.       ELSE
  247.      Success := TRUE;
  248.       END;
  249.  
  250.       NBase^ [State] := b;
  251.       NTableSize := Max (NTableSize, b);
  252.       FOR Symbol := LastTerminal+1 TO LastSymbol DO
  253.      IF (TableLine [Symbol] # NoState) THEN
  254.         NNext^ [b + Symbol] := TableLine [Symbol];
  255.         INC (NFilling);
  256.      END;
  257.       END;
  258.    END CompressNTableLine;
  259.  
  260. BEGIN
  261.   ElmtSize    := TSIZE(TableElmt);
  262.   Filling    := 0;
  263.   NFilling    := 0;
  264. END Compress.
  265.